#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File : 集合及其基本操作.py
@CreateTime :2021/11/11 18:44 
@Author : 许嘉凯
@Version  : 1.0
@Description : 
"""
"""
概念
	无序的, 不可随机访问的, 不可重复的元素集合
	与数学中集合的概念类似，可对其进行交、并、差、补等逻辑运算
	分为可变集合和非可变集合
		set
			为可变集合
				增
				删
				改
		frozenset
			不可变集合
				创建好之后, 无法增删改
定义
	可变集合set
		s = {1,2,3,4}
		s = set(iterable)
			其中iterable可以是字符串、列表、元组、字典等
			但是为dict时，只会获取提Key作为set的元素
		集合推导式
			 s = set(x**2 for x in range(1, 10) if x % 2 == 0)
			s = {推导式}
	不可变集合frozenset
		fs = frozenset(iterable)
			其中iterable可以是字符串、列表、元组、字典等
			但是为dict时，只会获取提Key作为set的元素
		集合推导式
			 s = frozenset(x**2 for x in range(1, 10) if x % 2 == 0)
	注意
		1. 创建一个空集合时, 需要使用set() 或者 frozenset(), 不能使用 s = {}
			会被识别成为字典
		2. 集合中的元素, 必须是可哈希的值
			如果一个对象在自己的生命周期中有一哈希值（hash value）是不可改变的，
那么它就是可哈希的（hashable）的
			暂时理解为 不可变类型
		3. 如果集合中的元素值出现重复, 则会被合并为1个
常用操作
	单一集合操作
		可变集合
			增
				s.add(element)
				注意:
					必须保证添加的元素是可哈希的值
			删
				s.remove(element)
					指定删除set对象中的一个元素
					如果集合中没有这个元素，则返回一个错误
				s.discard(element)
					指定删除集合中的一个元素
					若没有这个元素，则do nothing
				s.pop(element)
					随机删除并返回一个集合中的元素
					若集合为空，则返回一个错误
				s.clear()
					清空一个集合中的所有元素
			改
				元素为不可变类型, 不能修改
			查
				无法通过索引或key进行查询
				1. 通过 for in 进行遍历
				2. 通过迭代器进行访问
		不可变集合
			不能增删改
			查
				1. 通过 for in 进行遍历
				2. 通过迭代器进行访问
	集合之间操作
		交集
			intersection(Iterable)
				字符串
					只判定字符串中的非数字
				列表
				元组
				字典
					值判定key
				集合
				...
			逻辑与 '&'
			intersection_update(…)
				交集计算完毕后, 会再次赋值给原对象
					会更改原对象
					所以, 只适用于可变集合
		并集
			union()
				返回并集
			逻辑或 '|'
				返回并集
			update()
				更新并集
		差集
			difference()
			算术运算符减 ‘-‘
			difference_update()
		判定
			isdisjoint()两个集合不相交
			issuperset()一个集合包含另一个集合
			issubset()一个集合包含于另一个集合
	注意
		可变与不可变集合混合运算, 返回结果类型以运算符左侧为主
"""